#pragma once
#include <unistd.h>
#include "data_manage.hpp"

extern cloud::data_manage *dm;

namespace cloud
{
    class hot_manage
    {
    public:
        hot_manage()
        {
            config *c = config::get_instance();
            _hot_time = c->get_hot_time();
            _back_dir = c->get_back_dir();
            _pack_dir = c->get_pack_dir();
            _pack_suffix = c->get_packfile_suffix();

            // 若备份文件夹不存在，则创建之
            // 若压缩文件夹不存在，则创建之
            file_util fu1(_back_dir);
            file_util fu2(_pack_dir);
            fu1.create_dir();
            fu2.create_dir();
        }

        ~hot_manage(){}

        void start()
        {
            while(1)
            {
                sleep(1);

                // 遍历备份目录，获取所有文件名
                file_util fu(_back_dir);
                std::vector<std::string> files;
                fu.scan_dir(files);

                // 遍历判断文件是否是热点文件
                for(size_t i = 0; i < files.size(); ++i)
                {
                    if(check_hot(files[i]) == true)
                    {
                        continue;
                    }
                    else
                    {
                        // 压缩非热点文件
                        backup_info info;
                        bool ret = dm->get_one_by_realpath(files[i], info);
                        if(ret == false)
                        {
                            // 有一个文件存在，但没有备份信息
                            WARN("有一个文件存在，但没有备份信息");
                            info.init(files[i]);
                        }
                        file_util temp(files[i]);
                        temp.compress(info._pack_path);
                        info._pack_flag = true;

                        std::string ori_path = files[i];
                        std::string packed_path = _pack_dir + files[i].substr(files[i].find_last_of("/")) + _pack_suffix;
                        INFO("检测到一个非热点文件，已压缩之 %s --> %s", ori_path.c_str(), packed_path.c_str());

                        // 删除源文件，修改备份信息
                        temp.file_remove();
                        dm->updata(info);
                    }
                }
            }
        }

        bool check_hot(const std::string &file_name)
        {
            time_t now = time(nullptr);
            file_util fu(file_name);
            time_t atime = fu.last_access_time();
            if(atime + _hot_time > now)
            {
                // 热点文件返回true
                return true;
            }
            return false;
        }
    private:
        int _hot_time;            // 文件经过多少时间变为非热点文件
        std::string _back_dir;    // 备份文件夹
        std::string _pack_dir;    // 压缩文件夹
        std::string _pack_suffix; // 压缩后缀
    };
}